// darkmage.txt
// A modified version of basicnpc.txt, with a few special bits tucked away.
//  Governs the behavior of Darkside spellcasters in the scenario The Siege of
//  Copperpeak.
// This script enables the designer to designate sets of spells that can be
//  given to an NPC, at the exclusion of all others. For example, a normal NPC
//  who is given a Mage Spells score of 3 would automatically know Bolt of Fire,
//  Call Beast, and Haste (also Light and Spray Acid, which they never use).
//  Let's say that you're sick of NPCs who just haste themselves and their
//  allies, and you want to get rid of Haste. Just designate a spell set (see
//  below) that does not include Haste, and assign it to the NPC.
//
// Memory Cells:
//   Cell 0 - How creature moves.
//     0 - If 0, wander randomly. 
//     1 - Stands still until a target appears.
//     2 - Completely immobile, even if target appears.
//   Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this 
//     is killed, set to 1. (Example: If cell 1 is 3 and cell 2 is 5, when
//     creature is killed, sets SDF(3,5) to 1.)
//   Cell 3 - Dialogue node to start with if talked to. if left at 0, this
//     character doesn't talk.
//   Cell 8 - Spell set:
//	   0 - Normal. No modifications made.
//     1 - Summoner Set: Bolt of Fire, Call Beast, Haste, Slow, Create
// 			Illusions, and Summon Aid.
//     2 - Shaman Set: Bolt of Fire
//   Cell 9 - Special:
//     0 - Nothing.
//	   1 - "(name) is too terrified to speak." upon talking.
//     2 - "You think better of striking up a conversation..." for use
//			at docks. Second attempt at talking turns town hostile.
//     3 - Check for armor in START_STATE. If not safe, then turn my 
//          group hostile. Also uses the talking properties of special
//          #2. Used in Town 10.

begincreaturescript;

variables;

short i,target;
short speller;
short pc_counter, safety;

body;

beginstate INIT_STATE;
	if (get_memory_cell(0) == 2)
		set_mobility(ME,0);

	//Custom Spell Adjustment
	if(get_memory_cell(8) != 0) {
		//fix up my spell levels, if called for
		// 1. Reset everything to zero.
		speller = 0;
		while(speller <= 19) {
			if(get_spell_level(ME,0,speller) > 0)
				change_spell_level(ME, 0, speller, get_spell_level(ME,0,speller) * -1);
			if(get_spell_level(ME,1,speller) > 0)
				change_spell_level(ME, 1, speller, get_spell_level(ME,1,speller) * -1);
			speller = speller + 1;
			}
		// 2. Re-learn the important spells, depending on which set I know.
		
		// Summoner Set (1)
		if(get_memory_cell(8) == 1) {
			change_spell_level(ME,0,0,3); //Bolt of Fire - Level 3
			change_spell_level(ME,0,2,3); //Call Beast - Level 3
			change_spell_level(ME,0,4,2); //Haste - Level 2
			change_spell_level(ME,0,5,2); //Slow - Level 2
			change_spell_level(ME,0,8,2); //Create Illusions - Level 2
			change_spell_level(ME,0,14,2); //Summon Aid - Level 2
	

		}
	
		// Shaman Set (2)
		if(get_memory_cell(8) == 2) {
			change_spell_level(ME,0,0,2); //Bolt of Fire - Level 2
			change_spell_level(ME,1,2,2); //War Blessing - Level 2
			change_spell_level(ME,1,3,4); //Terror - Level 4
			change_spell_level(ME,1,10,2); //Mass Healing - Level 2
			change_spell_level(ME,1,11,2); //Mass Curing - Level 2
			change_spell_level(ME,1,12,2); //Radiant Shield - Level 2
			}
	
		//...clear the stupid text box, because stupid Windows computers
		//    have a stupid bug that shows all the stupid spell-learning
		//    text that NPCs learn. Stupid.
	
		i = 0;
		while (i < 64) {
			print_str(" ");
			i = i + 1;
			}
		}




break;

beginstate DEAD_STATE;
	// Set the appropriate stuff done flag for this character being dead
	if ((get_memory_cell(1) != 0) || (get_memory_cell(2) != 0))
		set_flag(get_memory_cell(1),get_memory_cell(2),1);
break;

beginstate START_STATE;

	//check for armor if party is visible (special: 3)
	if(get_memory_cell(9) == 3) {
		//only if party is visible to me
		// ...and don't bother if the jig is up
		if((can_see_char(1000) == 1) && (get_flag(10,2) != 1)) {
			//check to see if armor is equipped
			pc_counter = 0;
			while((pc_counter < 4) && (safety == 0)) {
				if((char_ok(pc_counter) == 1) && (item_type_in_slot(pc_counter,0) != 447))
					safety = 1; //not safe if armor isn't equipped
				pc_counter = pc_counter + 1;
				}
			if(safety == 1) {
				print_str_color("One of the Loyalists shouts an alarm. You've been spotted!",2);
				set_attitude(1000 + what_group_in(ME), 10);
				alert_char(1000 + what_group_in(ME));
				set_flag(10,2,1);
				}
			}
		}

	// if I have a target for some reason, go attack it
	if (target_ok()) {
		if (dist_to_char(get_target()) <= 16)
			set_state(3);
			else set_target(ME,-1);
		}
	
	// Look for a target, attack it if visible
	if (select_target(ME,8,0)) {
		do_attack();
		set_state(3);
		}
		
	// Have I been hit? Strike back!
	if (who_hit_me() >= 0) {
		set_target(ME,who_hit_me());
		do_attack();
		set_state(3);
		}
		
	// Otherwise, just peacefully move around. Go back to start, if I'm too far
	// from where I started.
	if ((my_dist_from_start() >= 6) || ((my_dist_from_start() > 0) && (get_memory_cell(0) > 0))) {
		if (get_ran(1,1,100) < 40) 
			return_to_start(ME,1);
		}
		else if (get_memory_cell(0) == 0) {
			fidget(ME,25);
			}

	// if we're in combat and the above didn't give me anything to do, just
	// stop now. Otherwise, game will keep running script, and that eats up CPU time.
	if (am_i_doing_action() == FALSE)
		end_combat_turn();
break;

beginstate 3; // attacking
	if (target_ok() == FALSE)
		set_state(START_STATE);
	do_attack();
break;

beginstate TALKING_STATE;

	//too terrified to talk (special: 1)
	if (get_memory_cell(9) == 1) {
		print_named_str(ME, "is too terrified to speak.");
		end();
		}
	
	//don't blow your cover! (special: 2, 3)
	if ((get_memory_cell(9) == 2) || (get_memory_cell(9) == 3)) {
	
		//for the Docks (t5)
		if(current_town() == 5) {
			if(get_flag(5,5) == 1) {
				message_dialog("You try to strike up a conversation with this Loyalist, but he immediately sees something he doesn't like. He shouts an alarm and draws his weapon.","");
				set_flag(5,1,1);
				}
			else {
				message_dialog("It occurs to you that if you're trying to sneak past these Loyalists, striking up a conversation might not be the best plan.","");
				set_flag(5,5,1);
				end();
				}
			}
		//for the Gates (t10)
		if(current_town() == 10) {
			if(get_flag(10,3) == 1) {
				message_dialog("You try to strike up a conversation with this Loyalist, but he immediately sees something he doesn't like. He shouts an alarm and draws his weapon.","");
				print_str_color("One of the Loyalists shouts an alarm. You've been spotted!",2);
				set_attitude(1000 + what_group_in(ME), 10);
				alert_char(1000 + what_group_in(ME));
				set_flag(10,2,1);
				}
			else {
				message_dialog("It occurs to you that if you're trying to sneak past these Loyalists, striking up a conversation might not be the best plan.","");
				set_flag(10,3,1);
				end();
				}
			}
		
		
		
		//options for other towns would go here
		
		}

	if ((get_memory_cell(9) == 0) && (get_memory_cell(3) == 0)) {
		print_str("Talking: It doesn't respond.");
		end();
		}
	else if(get_memory_cell(9) == 0)
		begin_talk_mode(get_memory_cell(3));
break;